const path = require("path");//nodejs核心模块，专门用来处理路径问题
const ESLintPlugin = require('eslint-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { VueLoaderPlugin } = require('vue-loader');
const { DefinePlugin } = require("webpack")

function getStyleLoaders(pre) {
  return [
    // 执行顺序，从右到左(从下到上)
    'vue-style-loader',
    'css-loader', //将css资源编译成commonjs的模块到js中
    {
      loader: 'postcss-loader',
      options: {
        postcssOptions: {
          plugins: [
            [
              'postcss-preset-env',
            ],
          ],
        },
      },
    },
    pre
  ].filter(Boolean) //array.filter(Boolean)：过滤假数据（false,0,-0."",null,undefined,NaN）
}


module.exports = {
  // 入口
  entry: "./src/main.js",
  // 输出
  output: {
    // 文件的输出路径
    path: undefined, // 开发模式没有输出，不需要指定输出目录
    // 文件名
    filename: "static/js/[name].js",
    // 动态导入输出资源命名方式
    chunkFilename: "static/js/[name].chunk.js",//chunk区分于主文件
    // 图片、字体等资源命名方式
    assetModuleFilename: 'static/media/[hash:10][ext]',
  },
  // 加载器
  module: {
    rules: [
      // loader的配置
      {
        test: /\.css$/, //只检测.css文件
        use: getStyleLoaders(),
      },
      {
        test: /\.less$/, //只检测.less文件
        use: getStyleLoaders("less-loader"),
      },
      {
        test: /\.s[ac]ss$/, //只检测.less文件
        use: getStyleLoaders("sass-loader"),
      },
      {
        test: /\.(png|jpe?g|gif|webp|svg)$/,
        type: 'asset',
        parser: {
          // 将小于4kb的文件转化为base64的url
          dataUrlCondition: {
            maxSize: 6 * 1024 // 6kb
          }
        },
      },
      {
        test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
        type: 'asset/resource', //导出位置在assetModuleFilename
      },
      {
        test: /\.js$/,
        include: path.resolve(__dirname, 'src'),
        loader: 'babel-loader',
        options: {
          cacheDirectory: true, // 开启babel编译缓存
          cacheCompression: false, // 缓存文件不要压缩
        }
      },
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      },
    ],
  },
  // 插件
  plugins: [
    new ESLintPlugin({
      context: path.resolve(__dirname, '../src'),
      exclude: "node_modules", // 默认值
      cache: true,//开启缓存
      // 缓存目录
      cacheLocation: path.resolve(
        __dirname,
        "../node_modules/.cache/.eslintcache"
      ),
    }),
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, "../public/index.html"),
    }),
    new VueLoaderPlugin(),
    // cross-env定义的环境变量给打包工具使用
    // DefinePlugin定义的环境变量是给源代码使用的
    new DefinePlugin({
      __VUE_OPTIONS_API__:true,
      __VUE_PROD_DEVTOOLS__:false,
      __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: false,
    })
  ],
  // 压缩的放这里
  optimization: {
    // 代码分割配置
    splitChunks: {
      chunks: "all", // 对所有模块都进行分割
    },
    runtimeChunk: {
      name: entrypoint => `runtime~${entrypoint.name}.js`,
    },
  },
  resolve: {
    // 自动补全文件扩展名
    extensions: ['.vue', '.js', '.json'],
  },
  // 开发服务器
  devServer: {
    host: "localhost", // 启动服务器域名
    port: "3001", // 启动服务器端口号
    open: true, // 是否自动打开浏览器
    hot: true, // 开启HMR功能，默认true（只能用于开发环境，生产环境不需要了）
    historyApiFallback: true, //前端访问报404时，显示index.html页面
  },
  // 模式
  mode: "development",
  devtool: "cheap-module-source-map"
}
